// 在user模块中维护一个token的数据 用于共享
// token本地存储的 => localStorage / cookie(内存小 - 完全够存储token)
// cookie除了内存小 还有一个毛病 数据的读取和设置非常恶心的 => js-cookie插件 能够让我们cookie操作类似localStorage

import { getToken, setToken, removeToken } from '@/utils/auth'
import { getUserInfo, login } from '@/api/user'
import { constantRoutes, resetRouter } from '@/router'

const state = {
  token: getToken() || '',
  userInfo: {}, // 用户信息
  routes: constantRoutes // 用户路由规则(静态+动态)
}

const mutations = {
  setRoutes(state, filterRoutes) {
    state.routes = [...constantRoutes, ...filterRoutes]
  },

  setToken(state, token) {
    state.token = token // 仓库中存
    setToken(token) // 本地
  },

  removeToken(state) {
    state.token = ''
    removeToken()
  },

  setUserInfo(state, obj) {
    state.userInfo = obj
  }
}

// action中一般用于处理异步, 当然同步也行
const actions = {
  async login(context, { mobile, password }) {
    // 请求 => 调用mutation
    // 模拟已经得到了token
    // const token = '1231jdhaskjfhdskajhfkl'

    const res = await login({ mobile, password })
    console.log(res) // 获取到token

    context.commit('setToken', res)
  },

  async getUserInfo(context) {
    // 调用请求函数
    const res = await getUserInfo() // res => 真正的数据
    context.commit('setUserInfo', res)
    return res
  },

  // 页面中一个action  调用了两个mutation
  logout(context) {
    context.commit('removeToken') // 清token
    context.commit('setUserInfo', {}) // 清用户信息

    resetRouter() // 退出时将项目中的router清空  保证每次登入用户 都是不累加路由规则的 而是基于空的router添加自己的路由规则
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
